#!/usr/bin/perl

my $child = fork();
die "cannot fork: $!" unless defined $child;
if($child == 0){ # child process
    open (STDOUT, ">log.txt") or die "open error $!";
    if(true){
        system('ls -l');
    }else{
        exec('ls', '-l');
        die "exec error : $!";          # cannot get here;
    }
}

#system & exec 函数。

# system 将另一个程序作为子进程运行，等待它完成，然后返回。
# 如果运行成功，返回结果码0 ！！！
# 反之不成功，返回结果码-1 ！！！

# $status = system('command and arguments');
# $status = system('command', 'and', 'argument');
# 命令及其参数可以作为一个单一的字符指定，或者作为一个列表指定，该列表包含命令及其参数，但都作为独立的元素。
# 在前一种形式，字符串不加改动直接传递给shell。这就允许你执行包含shell元字符（例如重定向）的命令。
# 在后一种形式允许执行参数中包含空格、shell元字符及其他特定字符命令，但它根本不解释元字符。

# exec 与 system 相似，但它以指定的命令替换当前进程。如果运行成功，exec从不返回，因为进程没了。
# 新进程将具有和老进程一样的pid，并共享STDIN STDOUT STDERR文件句柄。然而其他打开的文件句柄将被自动关闭。
# $status = exec('command and arguments');
# $status = exec('command', 'and', 'argument');
# exec 经常和 fork 组合使用，在做完特定启动之后作为一条子进程运行。